package ar.com.seminario.model;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Vector;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

import ar.com.seminario.common.domain.entity.Identifiable;

/**
 * Detalla a un perfil de un candidato.
 * 
 * @author Pablo Lamas
 * 
 */
@Entity
@Table(name = "perfil")
public class Perfil implements Identifiable<Long> {

	/**
	 * Identificador de la entidad.
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id", nullable = false)
	private Long id;

	/**
	 * Nombre del perfil.
	 */
	@Column(name = "nombre", nullable = false)
	private String nombre;

	/**
	 * Descripcion del perfil.
	 */
	@Column(name = "descripcion", nullable = false)
	private String descripcion;

	/**
	 * Descripcion del perfil.
	 */
	@Column(name = "es_template", nullable = false)
	private Boolean esTemplate;

	/**
	 * Lista de detalles del perfil.
	 */
	@ManyToMany(targetEntity = DetallePerfil.class, cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER)
	@JoinTable(name = "perfil_detalle", joinColumns = @JoinColumn(name = "perfil_id"), inverseJoinColumns = @JoinColumn(name = "detalle_perfil_id"))
	private List<DetallePerfil> detalles;

	/**
	 * Constructor por defecto.
	 */
	public Perfil() {

	}

	public Long getId() {
		return id;
	}

	protected void setId(Long id) {
		this.id = id;
	}

	public boolean addDetallePerfil(DetallePerfil detallePerfil) {

		if (this.detalles == null) {
			this.detalles = new ArrayList<DetallePerfil>();
		}

		return this.detalles.add(detallePerfil);
	}

	public boolean removeDetallePerfil(DetallePerfil detallePerfil) {

		if (this.detalles == null) {
			return (false);
		} else {
			return this.detalles.remove(detallePerfil);
		}
	}

	public List<DetallePerfil> getAllDetallesPerfil() {

		if (this.detalles == null) {
			return null;
		} else {
			return Collections.unmodifiableList(this.detalles);
		}
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public Boolean getEsTemplate() {
		return esTemplate;
	}

	public void setEsTemplate(Boolean esTemplate) {
		this.esTemplate = esTemplate;
	}
	
	public List<DetallePerfil> getDetallesObligatorios(){
		List<DetallePerfil> detallesObligatorios = new Vector<DetallePerfil>();
		for (DetallePerfil detalle : this.getAllDetallesPerfil()) {
			if(detalle.getEsObligatorio());
			detallesObligatorios.add(detalle);
		}
		return detallesObligatorios;
	}

	public boolean tieneTodosDetalles(List<DetallePerfil> detallesObligatorios) {
		for (DetallePerfil detallePerfil : detallesObligatorios) {
			if(!this.detalles.contains(detallePerfil))
				return false;
		}
		return true;
	}

	public DetallePerfil getDetalle(DetallePerfil detalle) {
		
		return this.detalles.get(this.detalles.indexOf(detalle));
	}
}
